package reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Scanner;

/**
 * 使用反射机制调用方法
 */
public class ReflectDemo4 {
    public static void main(String[] args) throws Exception{
        // 正常的创建实例化对象去调用方法
        Person person = new Person("张三", 18);
        person.sayHello();

        // 使用反射机制创建实例化对象去调用方法
        Class cls = Class.forName("reflect.Person");
//        Object obj = cls.newInstance(); // newInstance默认调用无参构造方法
        // 要想获取有参构造方法需要使用getConstructor()方法
        // 构造器
        Constructor constructor = cls.getConstructor(String.class, int.class);
        Object obj = constructor.newInstance("李四", 20);
        // System.out.println(obj);


        Method method = cls.getMethod("sayHello");
        method.invoke(obj);  // obj.sayHello();

        Scanner sc = new Scanner(System.in);
        System.out.println("请输入类名：");
        String classNameInput = sc.nextLine();
        Class cls2 = Class.forName(classNameInput);
        Constructor constructor2 = cls2.getConstructor(String.class, int.class);
        Object obj2 = constructor2.newInstance("王五", 30);

        System.out.println("请输入方法名：");
        String methodNameInput = sc.nextLine();
        Method method2 = cls2.getMethod(methodNameInput);
        method2.invoke(obj2);
    }
}
